ナビゲーション:前へ 上へ 次へ
11.7 プログラム単位と手続き
-
[7.0]
OPERATOR
総称の一部である関数の仮引数にVALUE
属性がある場合、INTENT(IN)
属性を持つ必要がなくなりました。例)
INTERFACE OPERATOR(+) MODULE PROCEDURE logplus END INTERFACE ... PURE LOGICAL FUNCTION logplus(a,b) LOGICAL,VALUE :: a,b logplus = a.OR.b END FUNCTION
-
[7.0]
ASSIGNMENT
総称の一部であるサブルーチンの2番目の引数にVALUE
属性がある場合、INTENT(IN)
属性を持つ必要がなくなりました。例)
INTERFACE ASSIGNMENT(=) MODULE PROCEDURE asgnli END INTERFACE ... PURE SUBROUTINE asgnli(a,b) LOGICAL,INTENT(OUT) :: a INTEGER,VALUE :: b DO WHILE (IAND(b,NOT(1))/=0) b = IEOR(IAND(b,1),SHIFTR(b,1)) END DO a = b/=0 ! Odd number of "1" bits. END SUBROUTINE
-
[7.0]
-recursiveまたは-f2018オプションを使用すると、手続きはデフォルトで再帰的になります。
例)INTEGER FUNCTION factorial(n) RESULT(r) IF (n>1) THEN r = n*factorial(n-1) ELSE r = 1 END IF END FUNCTION
上記サブプログラムはRECURSIVE
キーワードで明示的に宣言されているかのように有効です。これは、サイズ引継ぎ文字関数には適用されません(結果が
CHARACTER(LEN=*)
で宣言されている場合、これらはRECURSIVE
で宣言されないままです。)デフォルトで
RECURSIVE
の手続きは、RECURSIVE
として明示的に宣言されている場合とまったく同じように、-save省略可能な効果から除外されることに注意してください。 -
[7.0]
RECURSIVE
が明示的に宣言されているか、デフォルトで(-f2018または-recursiveオプションが指定されている場合)、要素別処理手続きが再帰的になる可能性があります。
例)ELEMENTAL RECURSIVE INTEGER FUNCTION factorial(n) RESULT(r) INTEGER,INTENT(IN) :: n IF (n>1) THEN r = n*factorial(n-1) ELSE r = 1 END IF END FUNCTION
上記は以下のように呼び出すことが可能です。PRINT *,factorial( [ 1,2,3,4,5 ] )
これにより最初の5つの階乗を出力されます。 -
NON_RECURSIVE
キーワードは、手続きが再帰的に呼び出されないことを明示的に宣言します。
例)NON_RECURSIVE INTEGER FUNCTION factorial(n) RESULT(r) r = 1 DO i=2,n r = r*i END DO END FUNCTION
Fortran 2008以前の標準では、手続きがデフォルトで非再帰的であるため、 -recursiveまたは-f2018が使用されていない限り、このキーワードは効果がありません。